// 组件接口 `Component`，定义了操作方法 `operation()`。
trait Component {
    fn operation(&self) -> String;
}

// 叶子节点 `Leaf` 结构体，实现了 `Component` 接口。
struct Leaf;

// 实现 `Component` 接口的方法。
impl Component for Leaf {
    fn operation(&self) -> String {
        "Leaf".to_string() // 返回叶子节点的操作结果
    }
}

// 组合节点 `Composite` 结构体，实现了 `Component` 接口。
struct Composite {
    children: Vec<Box<dyn Component>>, // 使用 `Vec` 存储子组件
}

// `Composite` 结构体的实现。
impl Composite {
    // 构造函数 `new()`，初始化组合节点对象，子组件列表为空。
    fn new() -> Self {
        Self {
            children: Vec::new(),
        }
    }

    // 添加子组件的方法 `add()`，接受一个实现了 `Component` 接口的对象作为参数，并将其加入子组件列表。
    fn add(&mut self, component: Box<dyn Component>) {
        self.children.push(component);
    }
}

// `Composite` 结构体也实现了 `Component` 接口，重写了 `operation()` 方法。
impl Component for Composite {
    fn operation(&self) -> String {
        let mut result = "Composite(".to_string();
        for child in &self.children {
            result.push_str(&child.operation()); // 遍历子组件列表，调用每个子组件的 `operation()` 方法并将结果添加到 `result` 中
        }
        result.push(')'); // 添加结尾的括号
        result // 返回操作结果
    }
}

// 主函数入口 `main()`，演示组合模式的使用。
pub fn main() {
    let mut composite = Composite::new(); // 创建根组合节点

    composite.add(Box::new(Leaf)); // 向根组合节点添加叶子节点
    composite.add(Box::new(Leaf));

    let mut root = Composite::new(); // 创建更高层次的组合节点
    root.add(Box::new(composite)); // 向更高层次的组合节点添加之前创建的根组合节点
    root.add(Box::new(Leaf)); // 向更高层次的组合节点添加叶子节点

    println!("Result: {}", root.operation()); // 打印根组合节点的操作结果，递归打印所有子组件的操作结果
}
